# -*- coding: utf-8 -*-
"""
@time：  2021/05/10  22:21
@Auto：Mr. xingye  993843278
@Company 星野训练营 99384378@qq.com
@Function:读写Excel

"""
from xlutils.copy import copy
from common.Logger import logger
import os
import xlrd, xlwt


class Reader:
    """
    用来读取Excel文件内容
    """

    def __init__(self):

        # 整个excel工作簿缓存
        self.workbook = None
        # 当前的工作sheet
        self.sheet = None
        # 记录sheet的行数
        self.rows = 0
        # 当前读取到的行数
        self.r = 0

    def open_excel(self, srcfile):
        if not os.path.isfile(srcfile):
            logger.error("%s not exist!" % (srcfile))
        # 设置读取excel使用utf8编码
        xlrd.Book.encoding = "utf8"
        # 读取excel内容到缓存workbook
        self.workbook = xlrd.open_workbook(filename=srcfile)
        # 选取第一个sheet页面
        self.sheet = self.workbook.sheet_by_index(0)
        # 设置rows为当前sheet的行数
        self.rows = self.sheet.nrows
        # 设置默认读取为第一行
        self.r = 0
        return

    # 获取sheet页面
    def get_sheets(self):
        sheets = self.workbook.sheet_names()
        return sheets

    def set_sheet(self, name):
        # 通过sheeet名字，切换sheet页面
        self.sheet = self.workbook.sheet_by_name(name)
        self.rows = self.sheet.nrows
        self.r = 0
        return

    def readline(self):
        lines = []
        # 如果当前还没到最后一行，则往下读取一行
        while self.r < self.rows:
            # 初始化列表，用来保存已经读取的用例
            row1 = None
            row = self.sheet.row_values(self.r)
            # 设置下次读取的一行
            self.r += 1
            row1 = row
            # 设置读取的列，从0开始
            i = 0
            for strs in row:
                row1[i] = str(strs)
                i = i + 1
            lines.append(row1)
        return lines


class Writer():
    """
    用来复制写入Excel文件
    """

    def __init__(self):
        # 读取需要复制的excel
        self.workbook = None
        # 记录要生成的文件，用来保存
        self.df = None
        # 拷贝的工作空间
        self.wb = None
        # 当前工作的sheet页
        self.sheet = None
        # 记录写入的行
        self.row = 0
        # 记录写入的列
        self.clo = 0

    def copy_open(self, srcfile, dstfile):
        # 判断要复制的文件是否存在
        if not os.path.isfile(srcfile):
            logger.error("%s not exist!" % (srcfile))
        if os.path.isfile(dstfile):
            logger.warning(dstfile + "file already exists!")
        # 记录要保存的文件
        self.df = dstfile
        # 读取文件到缓存中，带原来的格式
        self.workbook = xlrd.open_workbook(filename=srcfile, formatting_info=True)
        # 拷贝
        self.wb = copy(self.workbook)
        return

    # 获取sheet页面
    def get_sheets(self):
        # 获取所有sheetye的名字
        sheets = self.workbook.sheet_names()
        # print(sheets)
        return sheets

    # 切换sheet页面
    def set_sheet(self, name):
        self.sheet = self.wb.get_sheet(name)
        return

    # 写入指定单元格，保留原格式
    def write(self, r, c, value, color=None):
        """
        :param r: 行
        :param c: 列
        :param value: 要写入的字符串
        :param color: 0，黑色；1，白色；2，红色；3，绿色；4，蓝色；5，黄色
        :return:
        """

        # 获取要写入的单元格
        def __getCell(sheet, r, c):
            """ HACK: Extract the internal xlwt cell representation. """
            # 获取行
            row = sheet._Worksheet__rows.get(r)
            if not row:
                return None

            # 获取单元格
            cell = row._Row__cells.get(c)
            return cell

        # 获取要写入的单元格
        cell = __getCell(self.sheet, r, c)
        # 格式，把单元格原来的格式保存下来
        if cell:
            idx = cell.xf_idx

        if color is None:
            self.sheet.write(r, c, value)
            if cell:
                # 获取要写入的单元格
                ncell = __getCell(self.sheet, r, c)
                if ncell:
                    # 设置写入后格式和写入前一样
                    ncell.xf_idx = idx
        else:
            style = xlwt.XFStyle()
            font = xlwt.Font()  # 创建字体
            font.name = 'Arial'
            font.bold = True  # 黑体
            # font.underline = True  # 下划线
            # font.italic = True  # 斜体字
            font.colour_index = color  # 颜色为红色
            style.font = font

            # borders.left = xlwt.Borders.THIN
            # NO_LINE： 官方代码中NO_LINE所表示的值为0，没有边框
            # THIN： 官方代码中THIN所表示的值为1，边框为实线
            borders = xlwt.Borders()
            # 0 为黑色，与color参数一致
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top = xlwt.Borders.THIN
            borders.bottom = xlwt.Borders.THIN
            style.borders = borders
            # 写入值
            self.sheet.write(r, c, value, style)
        return

    # 保存
    def save_close(self):
        # 保存复制后的文件到硬盘
        self.wb.save(self.df)
        return

if __name__ == '__main__':
    reader = Reader()
    reader.open_excel('../../lib/webcase/cases/电商登录用例.xls')
    sheets = reader.get_sheets()
    for sheetname in sheets:
        print("sheet页为：" + sheetname)
        reader.set_sheet(sheetname)
        lines = reader.readline()
        print(lines)

    writer = Writer()
    writer.copy_open('../../lib/webcase/cases/电商登录用例.xls', '../../lib/webcase/cases/result-电商登录用例.xls')

    # 获取所有sheet
    sheets = writer.get_sheets()
    writer.set_sheet(sheets[0])
    # 在原格式上写入内容
    writer.write(1, 1, 'xingye')
    # 更改颜色写入
    writer.write(1, 8, 'pass', color=3)
    writer.save_close()
